#include <iostream>
#include <string>
#include <cstring>
#include <cerrno>
#include <ctime>
#include <unistd.h>
#include <pthread.h>

using namespace std;

__thread int g_val = 100;

string toHex(pthread_t t)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%x", t);
    return id;
}

void *threadRun(void *arg)
{
    cout << "thread: " << toHex(pthread_self()) << " g_val: " << ++g_val << " &g_val: " << &g_val << endl;
    return (void*)0;
}

int main()
{
    pthread_t t[3];
    for(int i = 0; i < 3; i++)
    {
        pthread_create(t + i, nullptr, threadRun, nullptr);
        sleep(1);
    }

    for(int i = 0; i < 3; i++)
        pthread_join(t[i], nullptr);
    return 0;
}

// string toHex(pthread_t t)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%x", t);
//     return id;
// }

// void *threadRun(void *arg)
// {
//     int tmp = 0;
//     cout << "thread " << toHex(pthread_self()) << " &tmp: " << &tmp << endl;

//     return (void*)0;
// }

// int main()
// {
//     pthread_t t[5];
//     for(int i = 0; i < 5; i++)
//     {
//         pthread_create(t + i, nullptr, threadRun, nullptr);
//         sleep(1);
//     }

//     for(int i = 0; i < 5; i++)
//         pthread_join(t[i], nullptr);
//     return 0;
// }

// void *threadRun(void *arg)
// {
//     pthread_detach(pthread_self());

//     int n = 5;
//     while(n)
//     {
//         cout << (const char*)arg << " " << n-- << endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t t;
//     pthread_create(&t, nullptr, threadRun, (void*)"thread-11");

//     int n = pthread_join(t, nullptr);
//     if(n != 0)
//         cerr << "errno " << errno << " " << strerror(errno) << endl;

//     return 0;
// }

// using namespace std;

// #define NUM 5

// // 线程信息类的状态
// enum class Status
// {
//     OK = 0,
//     ERROR
// };

// // 线程信息类
// class ThreadData
// {
// public:
//     ThreadData(const string &name, int id, int n)
//         :_name(name)
//         ,_id(id)
//         ,_createTime(time(nullptr))
//         ,_n(n)
//         ,_result(0)
//         ,_status(Status::OK)
//     {}

// public:
//     string _name;
//     int _id;
//     time_t _createTime;
//     int _n;
//     int _result;
//     Status _status;
// };

// void* threadRun(void *arg)
// {
//     ThreadData *td = static_cast<ThreadData*>(arg);

//     // 业务处理
//     for(int i = 0; i <= td->_n; i++)
//         td->_result += i;
    
//     // 如果业务处理过程中发现异常行为，可以设置 _status 为 ERROR
    
//     cout << "线程 " << td->_name << " ID " << td->_id << " CreateTime " << td->_createTime << " done..." << endl;

//     pthread_exit((void*)td);

//     // 也可以直接 return 
//     // return td;
// }

// int main()
// {
//     pthread_t pt[NUM];

//     for(int i = 0; i < NUM; i++)
//     {
//         // 注册新线程的信息
//         char name[64];
//         snprintf(name, sizeof(name), "thread-%d", i + 1);

//         // 创建对象
//         ThreadData *td = new ThreadData(name, i, 100 * (10 + i));
//         pthread_create(pt + i, nullptr, threadRun, td);
//         sleep(1); // 尽量拉开创建时间
//     }

//     // 等待次线程运行结束
//     void *retval = nullptr;
//     for(int i = 0; i < NUM; i++)
//     {
//         int ret = pthread_join(pt[i], &retval);
//         if(ret != 0)
//             cerr << "等待线程 " << pt[i] << " 失败!" << endl;

//         ThreadData *td = static_cast<ThreadData*>(retval);

//         if(td->_status == Status::OK)
//             cout << "线程 " << pt[i] << " 计算 [0, " << td->_n << "] 的累加和结果为 " << td->_result << endl;
//         delete td;
//     }

//     cout << "所有线程都退出了" << endl;

//     return 0;
// }

// void* threadRun(void *arg)
// {
//     while(true)
//     {
//         cout << "我是次线程，我正在运行..." << endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t t;
//     pthread_create(&t, nullptr, threadRun, nullptr);

//     while(true)
//     {
//         cout << "我是主线程 " << " 我创建了一个次线程 " << t << endl;
//         sleep(1);
//     }

//     return 0;
// }